oracle

推荐列表 站点导航

当前位置:首页 > 数据库 > oracle >

ORACLE单行函数与多行函数之四:日期函数示例

来源:网络整理  作者:网络  发布时间:2020-12-09 12:14
实验环境 : BYS@bys1select * from nls_session_parameters where parameter=NLS_DATE_FORMAT; PARAMETER VALUE -------------------- -------------------...
23.7196307
2014/01/01 00:00:00 2013/11/01 00:00:00 2013/11/03 00:00:00 2013/11/02 19:00:00 2013/11/02 19:00:00 2013/11/02 18:59:00

BYS@bys1>select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF2') from dual;
BYS@bys1>select round(sysdate,'yy') as year,round(sysdate,'mm') as month,round(sysdate,'dd') as day,round(sysdate,'hh') as hour,round(sysdate,'hh24') as hour24,round(sysdate,'mi') as minutes  from dual;
NLS_DATE_FORMAT      yyyy/mm/dd hh24:mi:ss

BYS@bys1>select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') between to_date('2013-11-02','yyyy-mm-dd') and  to_date('2013-11-03','yyyy-mm-dd hh24:mi:ss')-1/86400;
2013-11-05 13:48:22.123456789
BYS@bys1>col a3 for a30
------------------- -------------------
'TRU
------

nls_language                         string      AMERICAN

BYS@bys1>show parameter nls_lang
A1                             A2                             A3
ORA-01830: date format picture ends before converting entire input string
---------------------------------------------------------------------------
 
 select trunc(sysdate,'ss') as sss from dual
SYSTIMESTAMP
7.NEXT_DAY:表示以当前时间为基准,下一个"目标日"的日期 BYS@bys1>select next_day(sysdate,'sunday'),next_day(sysdate,'tuesday') from dual;
BYS@bys1>select systimestamp from dual;
ERROR at line 1:

      DDAY
'TRU
ERROR at line 1:
转换时未指定值时的默认值:年:同SYSDATE里的年;月:同SYSDATE里的月;日:1号;时分秒和纳秒:均为0
select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF9') from dual

同时在秒后最多只能指定9位。
BYS@bys1>select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF10') from dual;
------------------- ------------------- ------------------- ------------------- ------------------- -------------------
timestamp的显示格式不同于SYSDATE,要重新指定。
select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF2') from dual
BYS@bys1>col a2 for a30
---------- ------------------- ---------- -------------------
                      *
2.TIMESTAMP 记录了年、月、日、时、分、秒和纳秒

SYSTIMESTAMP返回的是TIMESTAMP WITH TIME ZONE 类型的数据。+08:00表示当前是东八区。
LAST_DAY(SYSDATE)
------------------------------ ------------------------------ ------------------------------

2013/11/03 19:34:20 2013/11/05 19:34:20

------------------- -------------------
4.判断指定日期是否是某一天的。to_date及date中如果只指定日期未指定时间,默认是0点0分0秒。即前一天23:59:59的下一秒。

注意BETWEEN AND 相当于大于等于和小于等于。所以属于某一天,严格来说应该是从当天0点的0秒到 当天23:59:59秒。1天除以86400即1秒

BYS@bys1>select sysdate+365,sysdate-1,sysdate-3,sysdate-1/24,sysdate-1/24/12 from dual;
TO_TIMESTAMP('0513:48:22.123456789','DDHH24:MI:SS.FF9')
ADD_MONTHS(SYSDATE, ADD_MONTHS(SYSDATE,
BYS@bys1>select months_between(sysdate,to_date('2011/11/11 11:11:11','yyyy-mm-dd hh24:mi:ss')) as dday from dual;

----
      DDAY
-------------------
ORA-01899: bad precision specifier ----

2013/12/02 18:39:23 2014/03/02 18:39:23

                    *
select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF10') from dual
---------------------------------------------------------------------------
–to_timestamp('2013-02-09 23:59:59.000','yyyy-mm-dd hh24:mi:ss.ff')
2013/01/01 00:00:00 2013/11/01 00:00:00 2013/11/02 00:00:00 2013/11/02 18:00:00 2013/11/02 18:00:00 2013/11/02 18:52:00
TO_TIMESTAMP('0513:48:22.778','DDHH24:MI:SS.FF5')
2013-11-05 13:48:22.778000000

BYS@bys1>select * from nls_session_parameters where parameter='NLS_DATE_FORMAT';
8.LAST_DAY:计算当前日期的最后一天,即当月最后一天。 BYS@bys1>select last_day(sysdate) from dual;

BYS@bys1>select to_timestamp('05 13:48:22.123456789','DD HH24:MI:SS.FF9') from dual;
YEAR                MONTH               DAY                 HOUR                HOUR24              MINUTES
---------------------------------------------------------------------------
                      *

BYS@bys1> select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') >= date'2013-11-02' and to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') <= date'2013-11-03'-1/86400;
–timestamp '2013-04-05 13:48:00.123456789'

BYS@bys1> select 'TRUE' from dual where to_date('2013-11-02 21:48:22','YYYY-MM-DD HH24:MI:SS') between date'2013-11-01' and date'2013-11-06'-1/86400;
     EMPNO HIREDATE                  DDAY SYSDATE
TRUE

------------------- ------------------- ------------------- ------------------- ------------------- -------------------

ORA-01899: bad precision specifier

BYS@bys1>select trunc(sysdate,'yy') as year,trunc(sysdate,'mm') as month,trunc(sysdate,'dd') as day,trunc(sysdate,'hh') as hour,trunc(sysdate,'hh24') as hour24,trunc(sysdate,'mi') as minutes  from dual;
-------------------- ------------------------------
6.ADD_MONTHS:表示给指定的日期加一个月数,即N个月后的日期。如果当前日期加上指定月数超过一年,则年份也自动增加。 BYS@bys1>select add_months(sysdate,1),add_months(sysdate,4) from dual;
----
SYSDATE+365         SYSDATE-1           SYSDATE-3           SYSDATE-1/24        SYSDATE-1/24/12
NEXT_DAY(SYSDATE,'S NEXT_DAY(SYSDATE,'T
02-NOV-13 09.11.19.258161 PM +08:00
–to_timestamp中的分隔符可以更换, timestamp中的日期分隔符必须是-,时间必须是:,秒后面必须跟上.
5.MONTHS_BETWEEN(a,b):表示a和b两个日期的月份之差,是a-b,如果a日期比b晚,即比b大,则为正数;反之,为负数。 BYS@bys1>Select EMPNO,HIREDATE,MONTHS_BETWEEN(Sysdate,HIREDATE)/12 dday,sysdate From EMP where rownum<3;
BYS@bys1> select trunc(sysdate,'ss') as sss from dual;
关于微秒的指定方式:FF5表示给的时间戳可以有不超过5位的微秒。如果时间戳微秒有3位,指定转换为FF2,则报错。

也可以用to_date对日期进行显式转换。
只能截取年、月、日、时、分;不能截取秒。
                                             *
表示TIMESTAMP的方法:
BYS@bys1>col a1 for a30
BYS@bys1>select to_timestamp('05 13','YY HH24') as a1,to_timestamp('05 13','mm mi') as a2,to_timestamp('05 13','dd ss') as a3 from dual;

2014/11/02 19:26:15 2013/11/01 19:26:152013/10/30 19:26:15 2013/11/0218:26:15 2013/11/0219:21:15

------------------- ------------------- ------------------- ------------------- -------------------

BYS@bys1> select 'TRUE' from dual where to_date('2013/11/02 23:59:59','YYYY-MM-DD HH24:MI:SS') >= date'2013-11-02' and to_date('2013/11/02 23:59:59','YYYY-MM-DD HH24:MI:SS') < date'2013-11-03';
BYS@bys1> select round(sysdate,'ss') as sss from dual;
BYS@bys1>select systimestamp from dual;
TRUE
      7499 1981/02/20 00:00:00 32.7036983 2013/11/02 18:37:05
----
1.直接使用SYSDATE加减数字来操作日期

日期+或-1,都代表加减一天的时间;而如果是一小时或几分钟这种,可以用天/小时这种方法。

要注意

 

PARAMETER            VALUE
3.date函数只可以表示日期,不可以表示时间。在下面4中有应用示例。

默认值:年:同SYSDATE里的年;月:同SYSDATE里的月;日:1号;时分秒:均为0

TRUE

YEAR                MONTH               DAY                 HOUR                HOUR24              MINUTES
TRUE

ERROR at line 1:
'TRUE'
                    *
select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') between to_date('2013-11-02','yyyy-mm-dd') and  to_date('2013-11-03','yyyy-mm-dd hh24:mi:ss')-1/86400;
      7369 1980/12/17 00:00:00 32.8784294 2013/11/02 18:37:05
BYS@bys1>select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF9') from dual;
ERROR at line 1:

注意BETWEEN AND 相当于大于等于和小于等于

'TRU
'TRU
2005-11-01 13:00:00.000000000  2013-05-01 00:13:00.000000000  2013-11-05 00:00:13.000000000
Session altered.
–timestamp可以精确表示到毫秒、微秒甚至纳秒级别
ERROR at line 1:
ORA-01880: the fractional seconds must be between 0 and 999999999
 select round(sysdate,'ss') as sss from dual
------------------------------------ ----------- ------------------------------
其实也可以用小于11月3号来表示小于等于11月2号的23:59:59秒。

---------------------------------------------------------------------------
----------
ORA-01821: date format not recognized


如下面语句,1小时是1/24;5分钟是1/24/12。86400:1天=24小时=24*60*60=86400秒

BYS@bys1>select months_between(to_date('2011/11/11 11:11:11','yyyy-mm-dd hh24:mi:ss'),sysdate) as dday from dual;
SYSTIMESTAMP
TRUE
----------
BYS@bys1>select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF5') from dual;
-23.719639
02-NOV-13 09.08.04.390741 PM +08:00
NAME                                 TYPE        VALUE
9.使用ROUND:对日期进行四舍五入 只能对年、月、日、时、分进行四舍五入;不能操作秒。

2013/11/30 18:43:16

10.使用TRUNC:对日期进行截取 BYS@bys1>set linesize 200

BYS@bys1>alter session set nls_timestamp_format='yyyy-mm-dd hh24:mi:ss.ff';

相关热词: oracle

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/sql/oracle/1805.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

ORACLE单行函数与多行函数之四:日期函数示例

2020-12-09 编辑:网络

23.7196307
2014/01/01 00:00:00 2013/11/01 00:00:00 2013/11/03 00:00:00 2013/11/02 19:00:00 2013/11/02 19:00:00 2013/11/02 18:59:00

BYS@bys1>select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF2') from dual;
BYS@bys1>select round(sysdate,'yy') as year,round(sysdate,'mm') as month,round(sysdate,'dd') as day,round(sysdate,'hh') as hour,round(sysdate,'hh24') as hour24,round(sysdate,'mi') as minutes  from dual;
NLS_DATE_FORMAT      yyyy/mm/dd hh24:mi:ss

BYS@bys1>select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') between to_date('2013-11-02','yyyy-mm-dd') and  to_date('2013-11-03','yyyy-mm-dd hh24:mi:ss')-1/86400;
2013-11-05 13:48:22.123456789
BYS@bys1>col a3 for a30
------------------- -------------------
'TRU
------

nls_language                         string      AMERICAN

BYS@bys1>show parameter nls_lang
A1                             A2                             A3
ORA-01830: date format picture ends before converting entire input string
---------------------------------------------------------------------------
 
 select trunc(sysdate,'ss') as sss from dual
SYSTIMESTAMP
7.NEXT_DAY:表示以当前时间为基准,下一个"目标日"的日期 BYS@bys1>select next_day(sysdate,'sunday'),next_day(sysdate,'tuesday') from dual;
BYS@bys1>select systimestamp from dual;
ERROR at line 1:

      DDAY
'TRU
ERROR at line 1:
转换时未指定值时的默认值:年:同SYSDATE里的年;月:同SYSDATE里的月;日:1号;时分秒和纳秒:均为0
select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF9') from dual

同时在秒后最多只能指定9位。
BYS@bys1>select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF10') from dual;
------------------- ------------------- ------------------- ------------------- ------------------- -------------------
timestamp的显示格式不同于SYSDATE,要重新指定。
select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF2') from dual
BYS@bys1>col a2 for a30
---------- ------------------- ---------- -------------------
                      *
2.TIMESTAMP 记录了年、月、日、时、分、秒和纳秒

SYSTIMESTAMP返回的是TIMESTAMP WITH TIME ZONE 类型的数据。+08:00表示当前是东八区。
LAST_DAY(SYSDATE)
------------------------------ ------------------------------ ------------------------------

2013/11/03 19:34:20 2013/11/05 19:34:20

------------------- -------------------
4.判断指定日期是否是某一天的。to_date及date中如果只指定日期未指定时间,默认是0点0分0秒。即前一天23:59:59的下一秒。

注意BETWEEN AND 相当于大于等于和小于等于。所以属于某一天,严格来说应该是从当天0点的0秒到 当天23:59:59秒。1天除以86400即1秒

BYS@bys1>select sysdate+365,sysdate-1,sysdate-3,sysdate-1/24,sysdate-1/24/12 from dual;
TO_TIMESTAMP('0513:48:22.123456789','DDHH24:MI:SS.FF9')
ADD_MONTHS(SYSDATE, ADD_MONTHS(SYSDATE,
BYS@bys1>select months_between(sysdate,to_date('2011/11/11 11:11:11','yyyy-mm-dd hh24:mi:ss')) as dday from dual;

----
      DDAY
-------------------
ORA-01899: bad precision specifier ----

2013/12/02 18:39:23 2014/03/02 18:39:23

                    *
select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF10') from dual
---------------------------------------------------------------------------
–to_timestamp('2013-02-09 23:59:59.000','yyyy-mm-dd hh24:mi:ss.ff')
2013/01/01 00:00:00 2013/11/01 00:00:00 2013/11/02 00:00:00 2013/11/02 18:00:00 2013/11/02 18:00:00 2013/11/02 18:52:00
TO_TIMESTAMP('0513:48:22.778','DDHH24:MI:SS.FF5')
2013-11-05 13:48:22.778000000

BYS@bys1>select * from nls_session_parameters where parameter='NLS_DATE_FORMAT';
8.LAST_DAY:计算当前日期的最后一天,即当月最后一天。 BYS@bys1>select last_day(sysdate) from dual;

BYS@bys1>select to_timestamp('05 13:48:22.123456789','DD HH24:MI:SS.FF9') from dual;
YEAR                MONTH               DAY                 HOUR                HOUR24              MINUTES
---------------------------------------------------------------------------
                      *

BYS@bys1> select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') >= date'2013-11-02' and to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') <= date'2013-11-03'-1/86400;
–timestamp '2013-04-05 13:48:00.123456789'

BYS@bys1> select 'TRUE' from dual where to_date('2013-11-02 21:48:22','YYYY-MM-DD HH24:MI:SS') between date'2013-11-01' and date'2013-11-06'-1/86400;
     EMPNO HIREDATE                  DDAY SYSDATE
TRUE

------------------- ------------------- ------------------- ------------------- ------------------- -------------------

ORA-01899: bad precision specifier

BYS@bys1>select trunc(sysdate,'yy') as year,trunc(sysdate,'mm') as month,trunc(sysdate,'dd') as day,trunc(sysdate,'hh') as hour,trunc(sysdate,'hh24') as hour24,trunc(sysdate,'mi') as minutes  from dual;
-------------------- ------------------------------
6.ADD_MONTHS:表示给指定的日期加一个月数,即N个月后的日期。如果当前日期加上指定月数超过一年,则年份也自动增加。 BYS@bys1>select add_months(sysdate,1),add_months(sysdate,4) from dual;
----
SYSDATE+365         SYSDATE-1           SYSDATE-3           SYSDATE-1/24        SYSDATE-1/24/12
NEXT_DAY(SYSDATE,'S NEXT_DAY(SYSDATE,'T
02-NOV-13 09.11.19.258161 PM +08:00
–to_timestamp中的分隔符可以更换, timestamp中的日期分隔符必须是-,时间必须是:,秒后面必须跟上.
5.MONTHS_BETWEEN(a,b):表示a和b两个日期的月份之差,是a-b,如果a日期比b晚,即比b大,则为正数;反之,为负数。 BYS@bys1>Select EMPNO,HIREDATE,MONTHS_BETWEEN(Sysdate,HIREDATE)/12 dday,sysdate From EMP where rownum<3;
BYS@bys1> select trunc(sysdate,'ss') as sss from dual;
关于微秒的指定方式:FF5表示给的时间戳可以有不超过5位的微秒。如果时间戳微秒有3位,指定转换为FF2,则报错。

也可以用to_date对日期进行显式转换。
只能截取年、月、日、时、分;不能截取秒。
                                             *
表示TIMESTAMP的方法:
BYS@bys1>col a1 for a30
BYS@bys1>select to_timestamp('05 13','YY HH24') as a1,to_timestamp('05 13','mm mi') as a2,to_timestamp('05 13','dd ss') as a3 from dual;

2014/11/02 19:26:15 2013/11/01 19:26:152013/10/30 19:26:15 2013/11/0218:26:15 2013/11/0219:21:15

------------------- ------------------- ------------------- ------------------- -------------------

BYS@bys1> select 'TRUE' from dual where to_date('2013/11/02 23:59:59','YYYY-MM-DD HH24:MI:SS') >= date'2013-11-02' and to_date('2013/11/02 23:59:59','YYYY-MM-DD HH24:MI:SS') < date'2013-11-03';
BYS@bys1> select round(sysdate,'ss') as sss from dual;
BYS@bys1>select systimestamp from dual;
TRUE
      7499 1981/02/20 00:00:00 32.7036983 2013/11/02 18:37:05
----
1.直接使用SYSDATE加减数字来操作日期

日期+或-1,都代表加减一天的时间;而如果是一小时或几分钟这种,可以用天/小时这种方法。

要注意

 

PARAMETER            VALUE
3.date函数只可以表示日期,不可以表示时间。在下面4中有应用示例。

默认值:年:同SYSDATE里的年;月:同SYSDATE里的月;日:1号;时分秒:均为0

TRUE

YEAR                MONTH               DAY                 HOUR                HOUR24              MINUTES
TRUE

ERROR at line 1:
'TRUE'
                    *
select 'TRUE' from dual where to_date('2013/11/02 21:45:43','YYYY-MM-DD HH24:MI:SS') between to_date('2013-11-02','yyyy-mm-dd') and  to_date('2013-11-03','yyyy-mm-dd hh24:mi:ss')-1/86400;
      7369 1980/12/17 00:00:00 32.8784294 2013/11/02 18:37:05
BYS@bys1>select to_timestamp('05 13:48:22.1234567890','DD HH24:MI:SS.FF9') from dual;
ERROR at line 1:

注意BETWEEN AND 相当于大于等于和小于等于

'TRU
'TRU
2005-11-01 13:00:00.000000000  2013-05-01 00:13:00.000000000  2013-11-05 00:00:13.000000000
Session altered.
–timestamp可以精确表示到毫秒、微秒甚至纳秒级别
ERROR at line 1:
ORA-01880: the fractional seconds must be between 0 and 999999999
 select round(sysdate,'ss') as sss from dual
------------------------------------ ----------- ------------------------------
其实也可以用小于11月3号来表示小于等于11月2号的23:59:59秒。

---------------------------------------------------------------------------
----------
ORA-01821: date format not recognized


如下面语句,1小时是1/24;5分钟是1/24/12。86400:1天=24小时=24*60*60=86400秒

BYS@bys1>select months_between(to_date('2011/11/11 11:11:11','yyyy-mm-dd hh24:mi:ss'),sysdate) as dday from dual;
SYSTIMESTAMP
TRUE
----------
BYS@bys1>select to_timestamp('05 13:48:22.778','DD HH24:MI:SS.FF5') from dual;
-23.719639
02-NOV-13 09.08.04.390741 PM +08:00
NAME                                 TYPE        VALUE
9.使用ROUND:对日期进行四舍五入 只能对年、月、日、时、分进行四舍五入;不能操作秒。

2013/11/30 18:43:16

10.使用TRUNC:对日期进行截取 BYS@bys1>set linesize 200

BYS@bys1>alter session set nls_timestamp_format='yyyy-mm-dd hh24:mi:ss.ff';

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/sql/oracle/1805.shtml

相关文章

风云图片

推荐阅读

返回oracle频道首页